package wm.forecast;

import wm.pt.dao.PtDAO;

public class Forecast implements IForecast {

	private PtDAO ptDAO;
	private float errorCuadraticoAlisadoExponencial = 0.0f;
	private float errorCuadraticoMediaMovil = 0.0f;
	private float errorCuadraticoAlisadoExponencialHolt = 0.0f;
	private float errorCuadraticoAlisadoExponencialHoltWinters = 0.0f;
	
    public Forecast() {
        this.ptDAO = PtDAO.getInstance();
    }

    public float getErrorCuadraticoAlisadoExponencial() {
		return errorCuadraticoAlisadoExponencial;
	}

	public void setErrorCuadraticoAlisadoExponencial(
			float errorCuadraticoAlisadoExponencial) {
		this.errorCuadraticoAlisadoExponencial = errorCuadraticoAlisadoExponencial;
	}

	public float getErrorCuadraticoMediaMovil() {
		return errorCuadraticoMediaMovil;
	}

	public void setErrorCuadraticoMediaMovil(float errorCuadraticoMediaMovil) {
		this.errorCuadraticoMediaMovil = errorCuadraticoMediaMovil;
	}

	public float getErrorCuadraticoAlisadoExponencialHolt() {
		return errorCuadraticoAlisadoExponencialHolt;
	}

	public void setErrorCuadraticoAlisadoExponencialHolt(
			float errorCuadraticoAlisadoExponencialHolt) {
		this.errorCuadraticoAlisadoExponencialHolt = errorCuadraticoAlisadoExponencialHolt;
	}

	public float getErrorCuadraticoAlisadoExponencialHoltWinters() {
		return errorCuadraticoAlisadoExponencialHoltWinters;
	}

	public void setErrorCuadraticoAlisadoExponencialHoltWinters(
			float errorCuadraticoAlisadoExponencialHoltWinters) {
		this.errorCuadraticoAlisadoExponencialHoltWinters = errorCuadraticoAlisadoExponencialHoltWinters;
	}

	@Override
	public int obtenerL() {
		
		return 0;
	}
	
	public float obtenerErrorCuadraticoMediaMovil(String tipoPeriodo, String tipoConsulta, int codigoProducto) {
		return ptDAO.obtenerErrorCuadraticoMediaMovil(tipoPeriodo, tipoConsulta, codigoProducto);
	}
	
	@Override
	public float obtenerErrorCuadraticoAlisadoExponencial(String tipoPeriodo, String tipoConsulta, int codigoProducto) {
		return ptDAO.obtenerErrorCuadraticoAlisadoExponencial(tipoPeriodo, tipoConsulta, codigoProducto);
	}

	@Override
	public float obtenerErrorCuadraticoAlisadoExponencialHolt(String tipoPeriodo, String tipoConsulta, int codigoProducto) {
		return ptDAO.obtenerErrorCuadraticoAlisadoExponencialHolt(tipoPeriodo, tipoConsulta, codigoProducto);
	}

	@Override
	public float obtenerErrorCuadraticoAlisadoExponencialHoltWinters(String tipoPeriodo, String tipoConsulta, int codigoProducto) {
		return ptDAO.obtenerErrorCuadraticoAlisadoExponencialHoltWinters(tipoPeriodo, tipoConsulta, codigoProducto);
	}

	@Override
	public String obtenerAlgoritmoOptimo(String tipoPeriodo, String tipoConsulta, int codigoProducto) {
		errorCuadraticoAlisadoExponencial = obtenerErrorCuadraticoAlisadoExponencial(tipoPeriodo, tipoConsulta, codigoProducto);
		errorCuadraticoMediaMovil = obtenerErrorCuadraticoMediaMovil(tipoPeriodo, tipoConsulta, codigoProducto);
		errorCuadraticoAlisadoExponencialHolt = obtenerErrorCuadraticoAlisadoExponencialHolt(tipoPeriodo, tipoConsulta, codigoProducto);
		errorCuadraticoAlisadoExponencialHoltWinters = obtenerErrorCuadraticoAlisadoExponencialHoltWinters(tipoPeriodo, tipoConsulta, codigoProducto);
		float errorCuadraticoOptimo = 0.0f;
		String algoritmoOptimo = "";
		
		
		if (errorCuadraticoAlisadoExponencial < errorCuadraticoMediaMovil){
			errorCuadraticoOptimo = errorCuadraticoAlisadoExponencial;
			algoritmoOptimo = "AlisadoExponencial";
		} else {
			errorCuadraticoOptimo = errorCuadraticoMediaMovil;
			algoritmoOptimo = "MediaMovil";
		}
		if (errorCuadraticoOptimo > errorCuadraticoAlisadoExponencialHolt){
			errorCuadraticoOptimo = errorCuadraticoAlisadoExponencialHolt;
			algoritmoOptimo = "AlisadoExponencialHolt";
		}
		if (errorCuadraticoOptimo > errorCuadraticoAlisadoExponencialHoltWinters){
			errorCuadraticoOptimo = errorCuadraticoAlisadoExponencialHoltWinters;
			algoritmoOptimo = "AlisadoExponencialHoltWinters";
		}
		return algoritmoOptimo;
	}

	@Override
	public float aplicarAlgoritmoOptimo(String algoritmoOptimo, String tipoPeriodo, String tipoConsulta, int codigoProducto) {
		if (algoritmoOptimo.equals("AlisadoExponencial"))
			return ptDAO.aplicarAlisadoExponencial(tipoPeriodo, tipoConsulta, codigoProducto);
			else if (algoritmoOptimo.equals("MediaMovil"))
				return ptDAO.aplicarMediaMovil(tipoPeriodo, tipoConsulta, codigoProducto);
				else if (algoritmoOptimo.equals("AlisadoExponencialHolt"))
					return ptDAO.aplicarAlisadoExponencialHolt(tipoPeriodo, tipoConsulta, codigoProducto);
					// if (algoritmoOptimo.equals("AlisadoExponencialHoltWinters"))
					else return ptDAO.aplicarAlisadoExponencialHoltWinters(tipoPeriodo, tipoConsulta, codigoProducto);
	}


}
